package com.cmc.cloud.cmclink.doc.service.manifest;

import com.cmc.cloud.cmclink.doc.api.document.rep.manifestrep.manifest.*;
import com.cmc.cloud.cmclink.doc.api.document.rep.manifestrep.manifestcntr.ManifestCntrRespVO;
import com.cmc.cloud.cmclink.doc.entity.ManifestDO;
import com.cmc.cloud.cmclink.doc.vo.manifestvo.manifest.ManifestCancelVO;
import com.cmc.cloud.cmclink.doc.vo.manifestvo.manifest.ManifestSalveReqVO;
import com.cmc.cloud.cmclink.doc.vo.manifestvo.manifest.ManifestTransitTermReqVO;
import com.cmc.cloud.cmclink.doc.vo.manifestvo.manifestcntr.ManifestCntrCheckLclReqVO;
import com.cmes.framework.common.pojo.CommonResult;
import com.cmes.framework.common.pojo.PageResult;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.Collection;
import java.util.List;

/**
 * 舱单主 Service 接口
 *
 * @author chenzheng
 */
public interface ManifestService {

    /**
     * 创建舱单主
     *
     * @param soIdList ids
     * @param userId   用户
     * @param dataSource   来源
     * @return 舱单主
     */
    List<Long> batchCreateMasterFromSo(List<Long> soIdList, String userId, String dataSource,boolean multiFlag);

    /**
     * 更新舱单主
     *
     * @param updateReqVO 更新信息
     * @param userId      用户
     * @return 舱单主
     */
    Long updateManifest(@Valid ManifestUpdateInfoReqVO updateReqVO, String userId);

    /**
     * 更新舱单主校验
     *
     * @param updateReqVO 更新信息
     * @return 舱单主
     */
    List<String> checkCargoCntrData(@Valid ManifestUpdateInfoReqVO updateReqVO);

    /**
     * 更新舱单主
     *
     * @param updateReqVO 更新信息
     * @param userId      用户
     * @return 舱单主
     */
    String updateManifestAndConfirm(ManifestUpdateInfoReqVO updateReqVO, String userId);

    /**
     * 删除舱单主
     *
     * @param ids    编号
     * @param userId 用户ID
     * @return 舱单主
     */
    void deleteManifestBatch(List<Long> ids, String userId);

    /**
     * 批量确认舱单
     *
     * @param ids     编号
     * @param userId  用户ID
     * @param confirm
     * @return 舱单主
     */
    String batchConfirm(List<Long> ids, String userId,boolean confirm);

    /**
     * 获得舱单主
     *
     * @param id 编号
     * @return 舱单主
     */
    ManifestInfoRespVO getManifest(Long id);

    /**
     * 获得舱单主
     *
     * @param bookingNo 编号
     * @return 舱单主
     */
    ManifestInfoRespVO getManifestDetailByBookingNo(String bookingNo);

    /**
     * 获得舱单主
     *
     * @param bookingNos 编号
     * @return 舱单主
     */
    List<ManifestDO> findByBookingNos(List<String> bookingNos);

    /**
     * 获得舱单主列表
     *
     * @param ids 编号
     * @return 舱单主列表
     */
    List<ManifestDO> getManifestList(Collection<Long> ids);

    /**
     * 获得舱单主分页
     *
     * @param pageReqVO 分页查询
     * @return 舱单主分页
     */
    PageResult<com.cmc.cloud.cmclink.doc.vo.manifestvo.manifest.ManifestRespVO> getManifestPage(ManifestPageReqVO pageReqVO);

    /**
     * 获得舱单 箱信息导入
     *
     * @param file
     * @param userId
     * @param response
     * @throws Exception
     */
    void importCntr(MultipartFile file, String userId, HttpServletResponse response) throws Exception;

    /**
     * 创建子舱单
     *
     * @param salveReq 子舱单数据
     * @param userId   userId
     * @param dataSource   来源
     * @return 舱单主
     */
    Long createSlaveManifest(ManifestSalveReqVO salveReq, String userId, String dataSource);

    /**
     * 检查是否拼箱
     *
     * @param reqVO 子舱单数据
     * @return true
     */
    boolean checkManifestLcl(ManifestCntrCheckLclReqVO reqVO);

    /**
     * 确认舱单批量确认检查lcl
     *
     * @param ids    编号
     * @param userId 用户ID
     * @return 异常
     */
    String checkConfirmLcl(List<Long> ids, String userId);

    /**
     * 检查是否能取消
     *
     * @param ids    编号
     * @param userId 用户ID
     * @return 舱单主
     */
    ManifestCancelVO checkCancel(List<Long> ids, String userId);

    /**
     * 取消舱单
     *
     * @param ids    编号
     * @param userId 用户ID
     */
    void cancelConfirm(List<Long> ids, String userId);

    /**
     * 中转类型修改
     *
     * @param transitTermReq 中转类型
     * @param userId         用户ID
     */
    void updateTransitTerm(ManifestTransitTermReqVO transitTermReq, String userId);

    /**
     * EDI 舱单同步
     *
     * @param ediInfo 编号
     * @param userId  用户ID
     * @return 返回信息
     */
    CommonResult<String> manifestEdiSync(ManifestEdiReqVO ediInfo, String userId);

    /**
     * EDI 舱单查询
     *
     * @param query 查询条件
     * @return 返回信息
     */
    CommonResult<List<ManifestInfoEdiRespVO>> manifestEdiDetailQuery(ManifestEdiQueryReqVO query);

    /**
     * EDI 舱单查询
     *
     * @param query 查询条件
     * @return 返回信息
     */
    CommonResult<List<ManifestRespVO>> manifestEdiQuery(ManifestEdiQueryReqVO query);

    /**
     * 通过bookingNo查询主舱单箱信息
     *
     * @param bookingNo 订舱号
     * @return 主舱单箱信息
     */
    List<ManifestCntrRespVO> getManifestCntrListByBookingNo(String bookingNo);

}
